#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <getch.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <dirent.h>
#include "tools.h"
#include "msg.h"

// 从键盘获取字符串
char* get_str(char* str, size_t len)
{
	if(NULL == str || 1 >= len) return NULL;

	fgets(str, len, stdin);
	size_t cnt = strlen(str);
	if('\n' == str[cnt-1])
	{
		str[cnt-1] = '\0';
	}
	clear_stdin();

	return str;
}

// 获取密码
char* get_passwd(char* passwd,bool is_show,size_t size)
{
	if(NULL == passwd) return NULL;
	int count = 0;
	do{
		char val = getch();
		if(127 == val)
		{
			if(count > 0)
			{
				if(is_show)printf("\b \b");
				count--;
			}
			continue;
		}
		else if(10 == val)
		{
			break;
		}
		passwd[count++] = val;
		if(is_show) printf("*");
	}while(count < size -1);
	passwd[count] = '\0';
	printf("\n");
	return passwd;
}

// 清理输入缓冲区
void clear_stdin(void)
{
	stdin->_IO_read_ptr = stdin->_IO_read_end;
}

// 任意键继续
void anykey_continue(void)
{
	puts("任意键继续...");
	getchar();
}

// 清理屏幕
void clear_src(void)
{
	system("clear");
}

// 从键盘获取指令
char get_cmd(char start, char end)
{
	if(start > end) return 0;
	
	printf("请输入指令：");
	while(true)
	{
		char cmd = getch();
		if(cmd >= start && cmd <= end)
		{
			printf("%c\n", cmd);
			return cmd;
		}
	}
}

// 从文件加载数据
void load_data(const char* path, void* ptr, size_t node_size)
{
	if(NULL == path || NULL == ptr) return;

	FILE* frp = fopen(path, "r");
	if(NULL == frp) return;	
	
	int cnt = 0;
	while(fread(ptr+cnt, node_size, 1, frp)) cnt ++;
	
	fclose(frp);
} 																						
// 保存数据到文件
void save_data(const char* path, void* ptr, size_t node_size, size_t num)
{
	if(NULL == path || NULL == ptr) return;

	FILE* fwp = fopen(path, "w");

	fwrite(ptr, node_size, num, fwp);
	
	fclose(fwp);
}

// 查找目录中是否存在需要的文件
bool fing_acc(char* str)
{
	DIR* dp = opendir(DATA_PATH);
	if(NULL == dp)
	{
		perror("opendir");
		return -1;
	}

	for(struct dirent* de=readdir(dp); NULL!=de; de=readdir(dp))
	{
		if(0 == strcmp(de->d_name, ".") || 0 == strcmp(de->d_name, "..")) continue;
		if(0 == strcmp(de->d_name, str))
		{
			//closedir(dp);
			return true;
		}
	}
	//closedir(dp);
	return false;
}

